package ar.edu.utn.frgp.EjemploHibernate.action.transferencias;

import java.util.Date;

import ar.edu.utn.frgp.EjemploHibernate.model.Cuenta;
import ar.edu.utn.frgp.EjemploHibernate.model.Transferencia;
import ar.edu.utn.frgp.EjemploHibernate.service.RecursoService;

import com.opensymphony.xwork2.ActionSupport;

public class AgregarTransferenciaAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	private Double monto;

	private RecursoService service;
	Cuenta cuenta = new Cuenta();
	private Double saldo;
	private Double descubierto;

	Transferencia transferencia = new Transferencia();
	private int idTransferencia;
	private int idCuentaOrigen;
	private int idCuentaDestino;
	private Date fecha;
	private Double saldoAterior;
	private Double saldoActual;
	private String tipoTransferencia;

	@Override
	public String execute() {

		try {
			// obtener cuenta
			cuenta = service.getCuenta(idCuentaOrigen);
			saldo = cuenta.getSaldo();
			descubierto = cuenta.getDescubierto();

			// setear transferencia
			idTransferencia=service.getMaxidTransferencia()+1;
			transferencia.setIdTransferencia(idTransferencia);
			transferencia.setIdCuentaOrigen(idCuentaOrigen);
			transferencia.setIdCuentaDestino(0);
			fecha = new Date();
			transferencia.setFecha(fecha);
			transferencia.setSaldoAnterior((cuenta.getSaldo()));
			transferencia.setDescubiertoAnterior(cuenta.getDescubierto());
			transferencia.setTipoTransferencia(tipoTransferencia);

			// cuando se hace un deposito
			if (tipoTransferencia.equals("DEPOSITO")) {
				if (descubierto < 900) {
					if ((descubierto + monto) <= 900) {
						descubierto += monto;
					} else {
						descubierto = (double) 900;
						monto = 900 - monto;
						saldo += monto;
					}
				} else {
					saldo += monto;
				}
				cuenta.setSaldo(saldo);
				cuenta.setDescubierto(descubierto);
				transferencia.setSaldoActual(saldo);
				transferencia.setDescubiertoActual(descubierto);
			}

			// cuando se hace una extraccion
			else if (tipoTransferencia.equals("EXTRACCION")) {
				if ((saldo - monto) >= 0) {
					saldo -= monto;
				} else {
					if ((saldo - monto + descubierto) < 0) {
						// se pasa del descubierto
						return ERROR;
					} else {
						descubierto += (saldo - monto);
						saldo = (double) 0;
					}
				}
				cuenta.setSaldo(saldo);
				cuenta.setDescubierto(descubierto);
				transferencia.setSaldoActual(saldo);
				transferencia.setDescubiertoActual(descubierto);
			}

			// Actualizar cuenta
			service.actualizarCuenta(cuenta);
			// Guardar Nueva Transferencia
			service.crearTransferencia(transferencia);
			return SUCCESS;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return ERROR;
		}
	}

	// getter y setter
	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public Double getMonto() {
		return monto;
	}

	public RecursoService getService() {
		return service;
	}

	public Cuenta getCuenta() {
		return cuenta;
	}

	public Double getSaldo() {
		return saldo;
	}

	public Double getDescubierto() {
		return descubierto;
	}

	public Transferencia getTransferencia() {
		return transferencia;
	}

	public int getIdTransaccion() {
		return idTransferencia;
	}

	public int getIdCuentaOrigen() {
		return idCuentaOrigen;
	}

	public int getIdCuentaDestino() {
		return idCuentaDestino;
	}

	public Date getFecha() {
		return fecha;
	}

	public Double getSaldoAterior() {
		return saldoAterior;
	}

	public Double getSaldoActual() {
		return saldoActual;
	}

	public String getTipoTransaccion() {
		return tipoTransferencia;
	}

	public void setMonto(Double monto) {
		this.monto = monto;
	}

	public void setService(RecursoService service) {
		this.service = service;
	}

	public void setCuenta(Cuenta cuenta) {
		this.cuenta = cuenta;
	}

	public void setSaldo(Double saldo) {
		this.saldo = saldo;
	}

	public void setDescubierto(Double descubierto) {
		this.descubierto = descubierto;
	}

	public void setTransferencia(Transferencia transferencia) {
		this.transferencia = transferencia;
	}

	public void setIdTransaccion(int idTransaccion) {
		this.idTransferencia = idTransaccion;
	}

	public void setIdCuentaOrigen(int idCuentaOrigen) {
		this.idCuentaOrigen = idCuentaOrigen;
	}

	public void setIdCuentaDestino(int idCuentaDestino) {
		this.idCuentaDestino = idCuentaDestino;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	public void setSaldoAterior(Double saldoAterior) {
		this.saldoAterior = saldoAterior;
	}

	public void setSaldoActual(Double saldoActual) {
		this.saldoActual = saldoActual;
	}

	public void setTipoTransaccion(String tipoTransaccion) {
		this.tipoTransferencia = tipoTransaccion;
	}

}
